#include<stdio.h>
#include<stdlib.h>

struct LNode
{
	int data;
	struct LNode *next;
};

//带结点的头插法创建单链表
/*
头插法创建单链表
即通过不断地将新创建的结点添加到链表的第一个数据结点之前，
作为链表新的首个数据结点的方法，创建单链表。

根据链表是否有头结点，头插法插入结点的位置有所不同：

若链表存在头结点，头插法需将新结点插入到头结点之后的位置。例如，采用头插法，将数据 {1,2,3} 依次插入到具有头结点的链表中，其插入过程如下

*/
struct LNode *CreateListT(struct LNode * L, int n)
{
	//1.先定义一个节点指针s指向新生结点，先建立一个头结点
	struct LNode *s;
	L=(struct LNode *)malloc(sizeof(struct LNode));
	L->next=NULL;
	//2循环输入数据,生成新的结点,每个新生节点加入到头结点后。
	//数据域赋值，指针域更换
	int data;
	while(n)
	{
		scanf("%d",&data);
		s=(struct LNode *)malloc(sizeof(struct LNode));
		s->data=data;
		s->next=L->next;
		L->next=s;
		n--;
	}
	return L;
}

//带头结点的尾插法创建单链表
struct LNode *CreateListF(struct LNode *L,int n)
{
	//1.先建立一个头结点，r始终指向尾结点开始指向头结点
	struct LNode *r,*s;//s指向新生结点，r指向尾结点
	L=(struct LNode *)malloc(sizeof(struct LNode));
	r=L;
	//2循环输入数据,生成新的结点，数据域赋值，指针域更换
	int data;
	while(n)
	{
		scanf("%d",&data);
		s=(struct LNode *)malloc(sizeof(struct LNode));
		s->data=data;
		r->next=s;
		r=s;
		n--;
	}
	//3.最后尾指针置位空
	r->next=NULL;
	return L;
}
void printfList(struct LNode *L)
{
	struct LNode *s=L->next;
	printf("尾插法创建单链表:\n");
	while(s!=NULL)
	{
		printf("%d ",s->data);
		s=s->next;
	}
}
int main()
{
	printf("输入你想创建的节点数:\n");
	int num;
	scanf("%d",&num);
	struct LNode *L;
	//创建
	//L=CreateListF(L,num);
	//打印
	//printfList(L);

	//创建
	L=CreateListT(L,num);
	//打印
	printfList(L);

	
	return 0;
}
